type EventType = 'click' | 'zoom' | 'moveend' | 'mouseenter' | 'mouseleave' | 'dragend' | 'rotate' | 'contextmenu'

interface EventCallback {
    (event: mapboxgl.MapMouseEvent | mapboxgl.Event): void;
}

let eventListeners: { [key in EventType]?: EventCallback[] } = {};

const eventManager = {
    /**
    * 添加事件监听器
    * @param map 地图实例
    * @param eventType 事件类型
    * @param callback 事件回调函数
    */
    addEventListener(map: any, eventType: EventType, callback: EventCallback): void {
        // 如果没有此类型的监听器，则初始化为空数组
        if (!eventListeners[eventType]) {
            eventListeners[eventType] = [];
        }

        // 添加新的事件回调
        eventListeners[eventType]?.push(callback);

        // Mapbox 注册该事件
        map.on(eventType, callback);
    },
    /**
   * 移除事件监听器
   * @param map 地图实例
   * @param eventType 事件类型
   * @param callback 事件回调函数
   */
    removeEventListener(map: any, eventType: EventType, callback: EventCallback): void {
        const listeners = eventListeners[eventType];
        if (listeners) {
            // 只移除匹配的回调
            eventListeners[eventType] = listeners.filter(fn => fn !== callback);
            if (eventListeners[eventType]?.length === 0) {
                // 如果没有监听器了，直接从对象中删除该事件类型
                delete eventListeners[eventType];
            }

            // 移除 Mapbox 上的事件监听
            map.off(eventType, callback);
        }
    },
    /**
     * 移除所有事件监听器
     * @param map 地图实例
     */
    removeAllEventListeners(map: any): void {
        Object.keys(eventListeners).forEach((eventType) => {
            const listeners = eventListeners[eventType as EventType];
            if (listeners) {
                listeners.forEach(callback => {
                    map.off(eventType as EventType, callback);
                });
            }
        });

        // 清空事件监听记录
        eventListeners = {};
    },
    /**
     * 触发所有的事件监听器（仅用于测试等场景）
     * @param eventType 事件类型
     * @param event 事件对象
     */
    triggerEvent(eventType: EventType, event: mapboxgl.MapMouseEvent | mapboxgl.Event): void {
        const listeners = eventListeners[eventType];
        if (listeners) {
            listeners.forEach(callback => {
                callback(event);
            });
        }
    }


}

export { eventManager }